/******************************************
Parqueo.java
Universidad del Valle de Guatemala
Algoritmos y Estructura de Datos
Autor:
    Martín Guzmán
Fecha: 22 de julio de 2009
Descripción: Clase de simulación de un parqueo
 * utilizando una pila como estructura de datos
 * Cuenta con 2 implementaciones:
 * 1- Con arreglos
 * 2- Con listas encadenadas dobles
*******************************************/

import java.lang.reflect.Array;
import java.util.Scanner;
import java.util.ArrayList;


public class Probando_Parqueo {
    private static int hacer;
    private static Scanner scan = new Scanner(System.in);
    private static Interfaz_stack<Vehiculo>Parqueo;
   
    //método main donde empieza la ejecución del programa
    public static void main(String args[])
    {

        System.out.println("\n**************************************************\n");
        System.out.println("           Bienvenido al programa de Parqueo\n");
        System.out.println("**************************************************");
        System.out.println("\n* Nota: en el estacionamiento puede guardar hasta 10 carros máximo");
        //*****************************************************************************************************************
        //*****************************************************************************************************************
        //************************ PARA USAR OTRA IMPLEMENTACIÓN, DESCOMENTARLA Y *****************************************
        //*********************************** COMENTAR LA OTRA ************************************************************
        //*****************************************************************************************************************
        //Parqueo = new Estacionamiento_implementacion_arreglo<Vehiculo>(); // ** PRIMERA IMPLEMENTACIÓN: ARREGLOS ********
        Parqueo = new Estacionamiento_implementacion_lista<Vehiculo>(); // **** SEGUNDA IMPLEMENTAICÓN: LISTA ENCADENADA **
        //*****************************************************************************************************************
        //*****************************************************************************************************************
        //*****************************************************************************************************************
        //*****************************************************************************************************************

        //ciclo para repetir hasta que quiera salir del programa
        do
        {
            Menu();
        } while (hacer!=4);//hasta que precione salir
        System.out.println("\n\n¡Gracias por utilizar el programa!");
    }

    //método que despliega el menú para realizar la acción del usuario ****************************
    public static void Menu(){
        do //ciclo hasta que ingrese bien una acción a realizar
        {
            System.out.println("\n\t** Menu Principal del Parqueo **");
            System.out.println("1- Ingresar vehículo");
            System.out.println("2- Sacar vehículo");
            System.out.println("3- Ver todo el parqueo");
            System.out.println("4- Salir del Programa");
            System.out.print("\t¿Qué desea hacer?\tMarque el numero: ");
            //despliega mensaje de error si no escoje una opcion del menu principal
            try{
                hacer=scan.nextInt();
            }
            catch(Exception exp){ //para prevenir el ingreso de algún caracter diferente a número
                System.out.println("¡Error accion no válida!\n");
                hacer=-1;
            }
            scan.nextLine();
            if ((hacer<1 || hacer>4) &&(hacer!=-1))
                System.out.println("¡Error accion fuera de las opciones!\n");

        } while (hacer<1 || hacer>4);

        //para realizar la accion marcada arriba
        switch (hacer)
        {
            case 1://  ********* INGRESAR VEHÍCULO ***********************************************

                String placa="";
                if(Parqueo.full()!=true){ //revisa si hay parqueos disponibles
                    String temporal_placa="";
                    System.out.print("\nPor favor, ingrese los datos que se le solicitan\n");//Ingrese su nombre: ");
                    boolean Pasar=false;
                    System.out.println("Para llenar la placa siga el siguiente ejemplo: P123ABC");
                    do{
                        System.out.print("Ingrese placa: ");
                        temporal_placa= scan.nextLine();
                        temporal_placa=temporal_placa.toUpperCase();
                        Pasar=true;
                    }while (Pasar==false);
                    //se coloca en el estacionamiento el carro correspondiente
                    Parqueo.push(new Vehiculo(temporal_placa));
                    System.out.println("\n\n************* Su vehículo ha sido parqueado en el estacionamiento correctamente *************");
                }else
                {
                    System.out.println("\n\n************* Lo sentimos, ya no hay espacio en el estacionamiento ************");
                }

                break;
                
            case 2://  ********* SACAR VEHÍCULO **************************************************
                if(Parqueo.empty()==true)//programación defensiva
                {
                    System.out.println("\n**** Disculpe, el parqueo está vacío, no puede retirar ningún vehículo ****\n");
                    break;
                }
                System.out.print("\nIngrese la placa: ");
                placa= scan.nextLine();
                placa = placa.toUpperCase();

                Vehiculo CarroTemporal = new Vehiculo(placa);
                
                int posicion_carro_a_desparquear=Parqueo.posicion_de(CarroTemporal);
                
                Estacionamiento_implementacion_lista<Vehiculo> Parqueo_temporal = new Estacionamiento_implementacion_lista<Vehiculo>();

                if (posicion_carro_a_desparquear==-1)
                {
                    System.out.println("\n\n****** Lo siento, se le cobrará multa debido a que su vehículo no se encuentra en el estacionamiento ******");
                }
                else
                {
                    int elementos_dentro=Parqueo.ultima_Posicion();
                    System.out.println("\nAntes de sacar algún vehículo\n"+Parqueo.toString());

                    ArrayList<Vehiculo> arreglo_carros_temporal= new ArrayList<Vehiculo>();

                    // para sacar todos los vehículos antes del que se quiere sacar
                    for (int i=posicion_carro_a_desparquear+1;i<elementos_dentro;i++)
                    {
                        arreglo_carros_temporal.add(Parqueo.pop());
                    }
                    if(arreglo_carros_temporal.size()!=0){
                        System.out.println("\nYa se sacaron todos los vehículos y a continuación se saca su vehículo\n"+Parqueo.toString());
                    }
                    // saca el vehículo en cuestión
                    Parqueo.pop();
                    System.out.println("\nSe ha sacado su vehículo correctamente\n"+Parqueo.toString());
                    //para volver a parquear
                    for(int i=arreglo_carros_temporal.size()-1;i>=0;i--)
                    {
                        Parqueo.push(arreglo_carros_temporal.get(i));
                    }
                    if(Parqueo.empty()==false && arreglo_carros_temporal.size()!=0){
                        System.out.println("\nEstacionando vehículos:\n"+Parqueo.toString());
                    }
                }

                break;
           case 3://  ********** VER PARQUEO *****************************************************
                String imprimir="\n*****************************************************\n";
                imprimir+="Usados: "+(Parqueo.ultima_Posicion())+"\nDisponibles: "+(Parqueo.getDisponibles())+"\n";
                imprimir+="\n";

                if(Parqueo.empty()){
                   imprimir+="|--|--|--|--|--|--|--|--|--|--|";
                }
                else
                {
                    imprimir+="Estacionamiento: \n"+((Parqueo.toString()));
                }
                imprimir+="\n"+"Fondo.......................Tope\n";
                imprimir+="\n**** Nomenclatura: |PLACA| = Ocupado  |--|= Vacio *******\n";

                System.out.println(imprimir);
                break;
        }
    }
}

